Post-Race UCLA Triathlon: Tritonman¶
The Bruins took on Tritonman hosted by UCSD Triathlon, a sprint distance triathlon. The planned 750-meter open water swim was canceled for the draft legal race and was instead replaced with an opening leg of one lap of the run course, which is approximately 1 mile. The bike leg, 21 kilometers long (~13 miles), consisted of three laps around Fiesta Island, and was followed by a 5-kilometer run to end the race.
Race highlight: On Saturday the Bruins took on the National Triathlon Development Race-certified Draft Legal division, where athletes compete for an elite license. In the men's race, UCLA’s Edoardo Leone and Colorado’s Matheus Menezes could not be separated until the final sprint, where Edo triumphed, tumbling over the line just a whisker ahead in an epic finish securing his first IRONMAN pro card for Oceanside 70.3 in a time of 52:02. At Oceanside, Edo finished 42nd in the men's pro field, outperforming his seed by 27 places at his first-ever 70.3. Edo was joined by fellow Bruins Miisa Makela and Austin Liu as Oceanside finishers.
The following includes results for every Bruin at this race, personalized graphs (for competitors whose split time data was available) showing how Bruins fared at each stage of the race, and informative statistics describing which legs best predicted the final results. This data analysis intends to provide grounds for celebration and further improvement. In the words of UCLA Triathlon alumnus Nathan Montanez, "knowing is half the battle." My hope is that this information is more visually appealing and engaging than a traditional essay-format presentation.
Please contact Lukas Rhoades at lukasrhoades11@gmail.com with any questions.
Draft Legal Race¶
from tristats import trirace
tritonman_dl = trirace()
tritonman_dl.set_legs(leg1="Run1", leg3="Run2")
tritonman_dl.get_data_active("TritonmanDraftLegal2025")
tritonman_dl.data.replace("--", None, inplace=True)
Men's team results¶
mens_dl = trirace()
mens_dl.set_legs(leg1="Run1", leg3="Run2")
mens_dl.set_data(tritonman_dl.get_gender("Male"))
mens_dl.data.reset_index(drop=True, inplace=True)
ucla_men_dl = ["Edoardo Giuseppe Leone", "Marius Genton", "Emiliano Olivo-Cauberghs"]
mens_dl.data[mens_dl.data.Name.isin(ucla_men_dl)]
| Name | Gender | Age | Run1 | T1 | Bike | T2 | Run2 | Total | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | Edoardo Giuseppe Leone | Male | 23 | 00:05:34 | 00:00:22 | 00:30:27 | 00:00:22 | 00:15:16 | 00:52:02 |
| 45 | Marius Genton | Male | 21 | 00:06:31 | 00:00:25 | 00:31:47 | 00:00:28 | 00:19:49 | 00:59:01 |
| 56 | Emiliano Olivo-Cauberghs | Male | 20 | 00:06:08 | 00:00:33 | 00:31:57 | 00:00:27 | 00:25:03 | 01:04:11 |
Women's team results¶
womens_dl = trirace()
womens_dl.set_legs(leg1="Run1", leg3="Run2")
womens_dl.set_data(tritonman_dl.get_gender("Female"))
womens_dl.data.reset_index(drop=True, inplace=True)
ucla_women_dl = ["Josie Goodson", "Eleanor Casey", "Kayla Kashima", "Miisa Makela", "Aedin McGoldrick", "Cassaundra Pino"]
womens_dl.data[womens_dl.data.Name.isin(ucla_women_dl)]
| Name | Gender | Age | Run1 | T1 | Bike | T2 | Run2 | Total | |
|---|---|---|---|---|---|---|---|---|---|
| 16 | Josie Goodson | Female | 21 | 00:07:04 | 00:00:46 | 00:36:05 | 00:00:47 | 00:20:03 | 01:04:47 |
| 17 | Cassaundra Pino | Female | 28 | 00:07:01 | 00:00:40 | 00:36:08 | 00:00:39 | 00:20:17 | 01:04:47 |
| 26 | Eleanor Casey | Female | 23 | 00:07:15 | 00:00:51 | 00:37:38 | 00:00:59 | 00:20:49 | 01:07:34 |
| 30 | Kayla Kashima | Female | 20 | 00:07:23 | 00:00:45 | 00:37:34 | 00:00:53 | 00:21:25 | 01:08:01 |
| 37 | Aedin McGoldrick | Female | 21 | 00:07:11 | 00:00:41 | 00:39:57 | 00:00:39 | 00:23:26 | 01:11:56 |
| 47 | Miisa Makela | Female | 23 | 00:09:29 | 00:00:38 | 00:44:11 | 00:00:49 | 00:28:35 | 01:23:44 |
Women's time distribution by legs¶
womens_dl.get_histograms("Tritonman Women's Draft Legal Race")
Men's time distribution by legs¶
mens_dl.get_histograms("Tritonman Men's Draft Legal Race")
Men's position charts¶
mens_dl.get_position()
for athlete in ucla_men_dl:
mens_dl.get_place_chart(athlete)
Women's position charts¶
womens_dl.get_position()
for athlete in ucla_women_dl:
womens_dl.get_place_chart(athlete)
Women's race leg importance¶
womens_dl.race_leg_imp("Tritonman Women's Draft Legal Race")
Men's race leg importance¶
mens_dl.race_leg_imp("Tritonman Men's Draft Legal Race")
Classic Race¶
tritonman_classic = trirace()
tritonman_classic.get_data_active("TritonmanClassic2025")
tritonman_classic.data.replace("--", None, inplace=True)
Women's team results¶
womens_classic = trirace()
womens_classic.set_data(tritonman_classic.get_gender("Female"))
womens_classic.data.reset_index(drop=True, inplace=True)
ucla_women_classic = ["Josie Goodson", "Josephine Borsetto", "Aliyah Anderson", "Alison Arndt", "Natasha Cosgrove", "Justine Marques",
"Emma M", "Lillian Aronovitz", "Brianna Choi", "Jolie Rice", "Triniti Santos", "Nicole Eskigian", "Shelby Jackson"]
womens_classic.data[womens_classic.data.Name.isin(ucla_women_classic)]
| Name | Gender | Age | Swim | T1 | Bike | T2 | Run | Total | |
|---|---|---|---|---|---|---|---|---|---|
| 19 | Josie Goodson | Female | 21 | 00:14:07 | 00:01:13 | 00:38:58 | 00:01:12 | 00:21:08 | 01:16:39 |
| 33 | Josephine Borsetto | Female | 22 | 00:14:28 | 00:01:02 | 00:41:21 | 00:00:38 | 00:21:20 | 01:18:51 |
| 43 | Lillian Aronovitz | Female | 21 | 00:14:02 | 00:01:50 | 00:41:31 | 00:00:49 | 00:22:47 | 01:21:01 |
| 56 | Aliyah Anderson | Female | 21 | 00:15:39 | 00:00:51 | 00:43:34 | 00:00:46 | 00:21:52 | 01:22:44 |
| 65 | Shelby Jackson | Female | 23 | 00:12:45 | 00:01:21 | 00:46:18 | 00:00:27 | 00:23:32 | 01:24:25 |
| 72 | Alison Arndt | Female | 21 | 00:16:57 | 00:01:32 | 00:43:25 | 00:00:46 | 00:22:46 | 01:25:28 |
| 107 | Jolie Rice | Female | 21 | 00:14:13 | 00:02:37 | 00:49:51 | 00:00:31 | 00:26:24 | 01:33:37 |
| 113 | Brianna Choi | Female | 19 | 00:16:06 | 00:02:05 | 00:51:24 | 00:00:37 | 00:25:23 | 01:35:35 |
| 115 | Justine Marques | Female | 20 | 00:14:03 | 00:02:43 | 00:51:46 | 00:00:30 | 00:26:57 | 01:36:01 |
| 124 | Nicole Eskigian | Female | 23 | 00:18:56 | 00:02:37 | 00:52:53 | 00:00:53 | 00:26:55 | 01:42:16 |
| 125 | Emma M | Female | 21 | 00:18:46 | 00:02:57 | 00:52:44 | 00:00:47 | 00:27:03 | 01:42:19 |
| 136 | Natasha Cosgrove | Female | 19 | 00:22:34 | None | None | None | 00:24:50 | 01:45:36 |
| 140 | Triniti Santos | Female | 20 | 00:16:19 | 00:02:50 | 00:57:55 | 00:03:24 | 00:29:26 | 01:49:56 |
Men's team results¶
mens_classic = trirace()
mens_classic.set_data(tritonman_classic.get_gender("Male"))
mens_classic.data.reset_index(drop=True, inplace=True)
ucla_men_classic = ["Edoardo Giuseppe Leone", "Austin Liu", "Emmett Cocke", "Jacob Niyazov", "Lachlan Guo", "Lucas Angier"]
mens_classic.data[mens_classic.data.Name.isin(ucla_men_classic)]
| Name | Gender | Age | Swim | T1 | Bike | T2 | Run | Total | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | Edoardo Giuseppe Leone | Male | 23 | 00:10:52 | 00:00:38 | 00:30:04 | 00:00:35 | 00:15:59 | 00:58:10 |
| 79 | Emmett Cocke | Male | 24 | NaN | NaN | NaN | NaN | NaN | 01:14:42 |
| 117 | Jacob Niyazov | Male | 20 | 00:17:27 | 00:01:56 | 00:39:54 | 00:00:39 | 00:18:59 | 01:18:57 |
| 155 | Lachlan Guo | Male | 20 | 00:14:43 | 00:01:23 | 00:38:48 | 00:00:47 | 00:28:14 | 01:23:56 |
| 159 | Austin Liu | Male | 24 | 00:18:18 | 00:01:05 | 00:37:06 | 00:01:53 | 00:26:09 | 01:24:34 |
| 190 | Lucas Angier | Male | 19 | 00:17:42 | 00:01:54 | 00:45:57 | 00:00:19 | 00:23:46 | 01:29:39 |
Men's time distribution by legs¶
mens_classic.get_histograms("Tritonman Men's Classic Race")
Women's time distribution by legs¶
womens_classic.get_histograms("Tritonman Women's Classic Race")
Women's position charts¶
womens_classic.get_position()
for athlete in ucla_women_classic:
womens_classic.get_place_chart(athlete)
Men's position charts¶
mens_classic.get_position()
for athlete in ucla_men_classic:
mens_classic.get_place_chart(athlete)
Men's race leg importance¶
mens_classic.race_leg_imp("Tritonman Men's Classic Race")
Women's race leg importance¶
womens_classic.race_leg_imp("Tritonman Women's Classic Race")